package src.escola;

import java.util.List;

import org.hibernate.Session;

import src.util.HibernateUtil;

public class GerenciadorEscola {

    public static void main(String[] args) {
        GerenciadorEscola gr = new GerenciadorEscola();

        if (args[0].equals("cria-professor")) {
            gr.criaProfessor("Professor");
        }
        else if (args[0].equals("lista-professores")) {
            List events = gr.listaProfessores();
            for (int i = 0; i < events.size(); i++) {
                Professor profs = (Professor) events.get(i);
                System.out.println("Professor: " + profs.getNome());
            }
        }
        else if (args[0].equals("cria-disciplina")) {
        	Long professorId = gr.criaProfessor("Marcelo");
        	gr.criaDisciplina(professorId, "BD");
        }
        
        else if (args[0].equals("cria-turma")) {
        	gr.criaTurma("TurmaBcc");
        }
        
        else if (args[0].equals("cria-turma-disciplina")) {
        	Long professorId = gr.criaProfessor("Marcelo");
        	Long disciplinaId = gr.criaDisciplina(professorId, "BD");
        	Long turmaId = gr.criaTurma("BCC");
        	gr.adicionaDisciplinaParaTurma(disciplinaId, turmaId);
        }
        
        else if (args[0].equals("cria-aluno")) {
        	Long turmaId = gr.criaTurma("BCC");
        	gr.criaAluno(turmaId, "Marcelo");
        }
        
        else if (args[0].equals("cria-endereco")) {
        	Long turmaId = gr.criaTurma("Matemática");
        	Long alunoId = gr.criaAluno(turmaId, "Marcelo");
        	gr.criaEndereco(alunoId, "Jacob Medeiros de Miranda", "São Paulo");
        }

        HibernateUtil.getSessionFactory().close();
    }

    private Long criaProfessor(String nome) {
    	Long id;
    	
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Professor prof = new Professor();
        prof.setNome(nome);        

        id = (Long)session.save(prof);

        session.getTransaction().commit();
        
        return id;
    }
    
    private List listaProfessores() {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        List result = session.createQuery("from Professor").list();

        session.getTransaction().commit();

        return result;
    }
    
    private Long criaDisciplina(Long professorId, String nome) {
    	
    	Long id;
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	
    	session.beginTransaction();
    	
    	Disciplina disciplina = new Disciplina();
    	disciplina.setNome(nome);
    	
    	Professor prof = (Professor)session.load(Professor.class, professorId);
    	prof.addDisciplina(disciplina);
    	
    	id = (Long)session.save(disciplina);
    	
    	session.getTransaction().commit();
    	
    	return id;
    	
    }
    
    private Long criaTurma(String nome) {
    	Long id;
    	
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Turma turma = new Turma();
        turma.setNome(nome);        

        id = (Long)session.save(turma);

        session.getTransaction().commit();
        
        return id;    	
    	
    }
    
    private void adicionaDisciplinaParaTurma(Long disciplinaId, Long turmaId) {
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	
    	Disciplina disciplina = (Disciplina)session.load(Disciplina.class, disciplinaId);
    	Turma turma = (Turma)session.load(Turma.class, turmaId);
    	
    	disciplina.adicionaTurma(turma);   	
    	
    	session.getTransaction().commit();
    	
    }
    
    private Long criaAluno(Long turmaId, String nome) {
    	Long id;
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	
    	Aluno aluno = new Aluno();
    	aluno.setNome(nome);
    	
    	Turma turma = (Turma)session.load(Turma.class, turmaId);
    	turma.adicionaAluno(aluno);
    	
    	id = (Long)session.save(aluno);
    	
    	session.getTransaction().commit();
    	
    	return id;
    }
    
    private Long criaEndereco(Long alunoId, String rua, String cidade) {
    	Long id;
    	
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	
    	Endereco endereco = new Endereco();
    	endereco.setRua(rua);
    	endereco.setCidade(cidade);
    	
    	Aluno aluno = (Aluno)session.load(Aluno.class, alunoId);
    	aluno.setEndereco(endereco);
    	
    	endereco.setAluno(aluno);
    	
    	id = (Long)session.save(endereco);
    	
    	session.getTransaction().commit();
    	
    	return id;
    	
    }
    

}
